/*
 * En este archivo, definimos las funciones comunes que realizaremos sobre las
 * matrices usadas en el soft
 */

#ifndef _MATRICES_H
#define	_MATRICES_H


    /*
     * En esta estructura guardaremos un apuntador a una matriz cuadrada y su dimensión
     */
    struct MATRIZ {
        char *nombre;
        int dimension;
        double **elementos;
    };

    /*
     * En esta estructura guardaremos un apuntador a un vector y su dimensión
     */
    struct VECTOR {
        char *nombre;
        int dimension;
        double *elementos;
    };

    /*
     * Crea una matriz cuadrada con la dimension especificada
     */
    struct MATRIZ* crearMatriz(int dimension);

    /*
     * Crea un vector de dimension especificada
     */
    struct VECTOR* crearVector(int dimension);

    /*
     * Elimina la memoria reservada para esta matriz
     */
    void eliminarMatriz(struct MATRIZ *matriz);

    /*
     * Elimina la memoria reservada para un vector
     */
    void eliminarVector(struct VECTOR *vector);

    /*
     * Este método le resta a la matriz la identidad por un escalar s.
     * Devuelve el resultado en la misma matriz.
     */
    void restarIxs(struct MATRIZ *matriz, double s);

    /*
     * Multiplica una matriz de n x n por otro vector de n x 1.
     * 'a' es la matriz que se debe multiplicar por el vector 'b'.
     * Retorna el vector resultante en 'resultado'
     */
    void multiplicar(struct MATRIZ *matriz, struct VECTOR *vector, struct VECTOR *resultado);

    /*
     * Busca cual es el mayor elemento en valor absoluto del vector y devueve su
     * posición dentro del vector.
     */
    int buscarMayorElemento(struct VECTOR *vector);

    /*
     * Multiplica la matriz A y B, devuelve el resultado de la multiplicación.
     * Se asume que ambas matrices son el resultado de una factorización LU.
     */
    struct MATRIZ* multiplicarMatricesLU(struct MATRIZ *matrizU, struct MATRIZ *matrizL);
    

#endif	/* _MATRICES_H */
